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.