The only coding practice that doesn't lead to bugs is to
not code at all. eval()s are as dangerous as code written
with vi - you can make the same mistakes.
You can make the same mistakes with any coding practice - agreed. Which leads to the question of how often you make them, and how quickly you catch them.
I submit that liberal usage of eval for most people leads to more mistakes, and more difficulty in tracking them down and debugging them. (Particularly if you don't religiously check $@.) Given its power it is sometimes worth going there. But not when there are built-in constructs for doing the same thing you are trying to do.