A) eval isn't supposed to capture those sort of errors.
B) if you read the friendly man pages it mentions that backticks sets the $! error variable, so you should be checking that.
C) Why are you bothering to fork a new process and execute du? What's wrong with the built in perl operators for determing file size? Like -s?