I think that the solution you imply of turning them off locally is the preferred one. Leave warnings on during development, and when you are sure you want to allow $foo to be undefined,
no warnings 'uninitialized'; # edit - corrected tag
print "Say something about $foo.\n";
That is a pain, as you say, but it makes you ask whether you really need the behavior you're warned of.
Most warnings (not all!) represent some kind of useless behavior in a program. Cleaning them up nearly always improves the code.