Methods that are defined with define_method are closures and they do not perform as well as methods created with evaled strings that are not closures.
So in general there is a performance versus safety tradeoff, with string evals being performance and block evals being safety.
Thankfully, you don't have to sacrifice one or the other.