Hadn't thought of this point -- finding dead code. I think there's gotta be a better way for finding that info though. Next question that pops into my head is if I could write a unit test, run it and get coverage info -- which would also provide enough info to deduce where dead/unused code was.
You should take a look at Devel::Cover then. I have used it for unit testing and I found it fairly useful.
I have not used it for program execution but it looks like it supports it. The only reason I thought of for not using it are that you cannot execute all branches of your code by running a program. Maybe it has a way of dealing with it but I am not sure, someone else may have the answer.