Me too. That must mean its a "best practice". :-)
However, when unpacking the passed args into named variables, there is often some cleanup that needs to be done, such as assigning defaults for unpassed values, sanitizing, etc. I would tend to classify breaking "last, first" into "last", "first" as part of that 'throw into named variables' phase rather than the 'guts' phase, where you are making meaningful changes or performing analysis.
I'm kinda weak about the last part, though. Sometimes I tend to return early, if I can determine what I'm going to send back from the subroutine. Screws up debugging, though. Use of your three part strategy means that one can put a print just before the final return, and gain insight into what the sub is really doing.