Эвал не зло. Эвал не сложный. Это функция, которая составляет список, который вы ей передаете. В большинстве других языков компиляция произвольного кода будет означать изучение AST языка и копаться во внутренностях компилятора, чтобы выяснить API компилятора. В lisp вы просто звоните eval.
Когда вы должны его использовать? Всякий раз, когда вам нужно что-то скомпилировать, обычно это программа, которая принимает, генерирует или изменяет произвольный код во время выполнения .
Когда не стоит его использовать? Все остальные случаи.
Почему бы вам не использовать его, когда вам это не нужно? Потому что вы будете делать что-то излишне сложным способом, который может вызвать проблемы с читабельностью, производительностью и отладкой.
Да, но если я новичок, как я узнаю, стоит ли мне его использовать? Всегда старайтесь реализовать то, что вам нужно, с помощью функций. Если это не сработает, добавьте макросы. Если это все еще не работает, тогда eval!
Следуйте этим правилам, и вы никогда не будете делать зло с помощью eval:)