|Come for the quick hacks, stay for the epiphanies.
I have to agree with tilly and ichimonki, Carp is vital. Especially for CGI, where I always use Carp(fatalstobrowser).
Otherwise on subroutines if I'm piping back data, I tend to return an integer > 0 for error messages. Depending on the subroutine, I might have a range of error codes to return if I don't want the program to die there. You might try out page 348 of the Perl Cookbook, which has some suggestions on the undef, wantarray and return functions that you might find useful.
This link is also good for silly die messages, if you're in the mood.