Both of your methods hide the actual value of $@, which I consider a horrible design idea. $@ often contains valuable information and hiding that from the users/programmers makes for ugly debugging. Personally, I prefer the following idiom:
my $filename = $module;
$filename =~ s-(::|')-/-g;
$filename .= '.pm';
require $filename; # dies with an informative message
Looking at Module::Load, it again contains many weirdo checks that I have come to distrust when it comes to load failures - far too often I've had syntax errors in my modules hidden by UNIVERSAL::require to want such ...