Are you sure about that? I have many shaders where gl_Position is not the last thing. Why does it have to be last?
Yep, I just verified this. This is with a device running a PowerVR SGX 530 GPU. Now I can't say for sure or not whether other things in the code have any influence over this. I just know that if I write anything after gl_Position, the data for the vertices and normals gets swapped (i.e. OpenGL thinks vertex data is normal data and vice versa). That's without changing anything else, just literally moving up/down two lines of code and recompiling.
I indeed did not have to put gl_Position last when the vetex shader was running on an Nvidia chip. It didn't seem to care.
I also changed my code from using separate buffers to a single OpenGL buffer to hold both vertices and normals, but that didn't seem to affect this issue.