Good point.
My goal in this was to be able to use more complicated "use" statements like:
use My::Module 0.04 qw( :sub1 :sub2 );
I just can't seem to get those to work with the require / import way so needed a way to "use", which didn't blow up if the module wasn't found. I'm sure I didn't "invent" this; rather, Google-d, found something and used it without understanding the implications you pointed out. And I've just been "using" it ever since.
I wonder if "undef $@" before the 'eval' would help ensure any error ending up in $@ is coming from the eval?