By definition, in a compiler, translation from symbols to code happens on the beforehand. But eval needs to do this at runtime. This means that to compile a program a la "eval(input_string)" the output program whould need to contain the entire compiler, which gets used to convert the eval_input before running.
So in practice you strapped a kind of interpreter to the output program. This is often inefficient and hackish, and thus it is more desirable to just not have a eval feature.
But if you're going to start cutting out the dynamic features, and those you don't think aren't desirable, then why are you challenging yourself to write a compiler language for a dynamic language in the first place? You could cut out all these troublesome features if you just picked a static language.
Heck, you don't even particularly need reflection, but eval even less so.
I doubt you'd find much use of eval in the top 100 most popular Python projects for example.
So it's not exactly that defining a feature.
If you’re interested in what it takes to compile dynamic languages, why did you leave out such a notable dynamic language feature?