Messing with @_ would make me nervous too. I would definitely stick with the Sub_With_NO_Side_Effects().
On the other hand, I'm against using subs when not needed. While checking for definedness annoys me too, it's often done while assigning @_ to local variables in the sub, so it's not that much more trouble. At least not worth the bother of another sub call when a cut and paste will do.
sub Sub_With_NO_Side_Effects {
my @arg = map { defined $_ ? $_ : '' } @_;
print "$_: '$arg[$_]'\n" foreach 0..$#arg;
}