My point was that sometimes undef
may not lead to a warning, but your sub won't do what you expect it to. Lack of proper sub signatures is sometimes annoying.
perllexwarn also talks about code in modules; -w enables warnings anywhere, so other people's code (i.e. those people who knew what they were doing and turned off warnings for relevant parts of their code) will throw warnings at you. It may be a lot of warnings.
"Throwing a warning" is exactly equivalent to "returning useless stuff silently" in most scenarios; warnings are written to stderr, which is not available for a lot of programs. And even if it is available — most end users just ignore it. If your code is potentially destructive (and what code isn't) you should die in unexpected situations, not issue a warning.
Also: use warnings FATAL => 'all' is much more aggressive than -w.