All evals are not created equal! Brian Feldman's writeup refers to the most common type: "parse this string and run it through the interpreter". This form is obviously slow and can easily (in the presence of strings from the program's input) be unsafe. Perl supports it as the "eval "string"" form. Of course, this (or its close variants) is the only way to write some programs which must read and execute some input.

A better form of eval simply says "run this code in a separate copy of the interpreter (and tell me if it worked)". In this case, the code is parsed once, but evaluated in different interpreters. This form is more akin to building some lambda expression, then executing it multiple times. Perl supports it as the "eval { block }" form. In that language, you can use it to do things like catch an abnormal exit (with die) from the code, so you can write catch and throw.

The second form is compiled only once, and cannot cause code based on program input to run. So it's much faster, has much more predictable efffects, and is a lot safer.