Well, if you mean why not use things from @_ directly: items in @_ are aliases to the things passed in; if you're not careful you can unintentionally modify something of your caller's.
my $foo = "bar";
sub bad_example { $_[0] =~ s/a/oo/; $_[0] }
print "\$foo: $foo\n";
print "bad_example returns: ", bad_example( $foo ), "\n";
print "uh oh, \$foo: $foo\n";
Now if you just mean why not always use the my( $a, $b, $c ) = @_; form vice shift: there's times when you want to pull off some items and then do something list-y with the remaining contents of @_. Best example off the top of my head would be something that builds a hash from key/value pairs like:
sub take_one_and_hash {
my $one = shift;
my %hash = @_;
## frobulate $one based on %hash . . .
}
Unless you pull that first argument off with shift you'd have to do something like @_[1..$#_] which just looks crufty.