I guess the question you should be asking, why is unsafe data getting passed to subroutines/methods in the first place.
Perhaps from the programmer mistyping the argument list or misunderstanding the interface?
Validating data from external sources is always needed. Validating data from internal sources is very useful during development and testing (ala C's assert()) and sometimes during production. Params::Validate has helped save me from my own bad memory/typing a number of times. It's not too hard to set it up so you can remove it from production code easily if that's what you want.