What's the difference between calling a function as &foo and foo()?

When you call a function as &foo, you allow that function access to your current @_ values, plus you by-pass prototypes. That means that the function doesn't get an empty @_, it gets yours! While not strictly speaking a bug (hey, it's documented that way in the perlsub manpage!), it would be hard to construe this a feature in most cases.

When you call your function as &foo, then you do get a new @_, but prototyping is still circumvented.

Normally, you want to call a function using foo. You may only omit the parentheses if the function is already known to the compiler because it already saw the definition (use but not require), or via a forward reference or use subs declaration. Even in this case, you get a clean @_ without any of the old values leaking through where they don't belong.