The difference is described in perlsub
: The ampersand is used to circumvents prototypes or make the current @_ visible to the called subroutine.
What is a prototype, you ask? It's described in the same perlsub, or you can read Far More than Everything You've Ever Wanted to Know about Prototypes in Perl -- by Tom Christiansen.
Forwarding the argument list can be confusing, especially if there's a shift or pop involved, or when calling a functional subroutine from a method.