eval BLOCK and eval STRING have as much in common as select FILEHANDLE has with the four-argument version, in my opinion. Since the block contents are known at compile time, they're compiled. Since string contents can't be known at compile time, they must be compiled at run time.
I do agree that using eval to catch death from the Fatal module is particularly ugly.