A more accurate model is that Perl calls a subroutine with a flag that says "I want a scalar" or "I want a list". When the last expression of the subroutine is evaluated (such as for a return operator), that subroutine gets scalar or list eval context applied to it, as appropriate.
So, a subroutine returns a list or scalar. Always. It never returns an array. If you write return @a, it will return the length of array @a in a scalar context, or a list copied from the contents of @a in a list context. At no time has it "returned" the "array" @a.