In my view, callbacks are no more "evil" than other types of event-handling; they just require more care on the part of the programmer. C++ methods are more robust, but also lard the program with additional overhead and execution lag.
Monty, do you have even the faintest idea what you're talking about? Where is this supposed "execution lag"? What's the practical difference between a C++ "method" (by which I assume you mean a virtual function) and a callback, anyhow, aside from the compiler accounting? (Hint: about three instructions.)
Anything that calls for "more care on the part of the programmer", that could be entirely automated at essentially no cost, is inherently evil. The inevitable lapse of that painfully limited resource, care, is the most fertile source of bugs. Hoard and husband your care, and defend against all things that squander it.
* * *
A new aphorism: "Array boundaries are representatives of God. Disrespect them and God will surely smite you." This leads to assert()s as prayers, and the miracle of a bug-free program for the sufficiently penitent, such as Saint Knuth. (This is not a wholly new concept; "Cleanliness is next to godliness" correctly connects failures of hygiene to the traditionally divine curses of pestilence and plague.)
"Overindex shalt thou not, nor call strcpy() on untested input. gets() is right out."