Hi,
you need to start on a fresh project with a simple cube, and build up from there.
the world to screen will give you the exact screen position of the pivot point of your gameObject target. Then it's up to you within your GUIText setup to define how the text is going to be positioned and aligned.
All the tests that I have done do not expose any such unwanted offset, so I guess something is fishy in the implementation itself.
-- Any live position matching between a 3d world and a 2d screen MUST be performed everyframe, there is no escape, and you should not be too worried about performances as this operation is a built in method within Unity, so it should be ok. have you run some profiling already on this?
Bye,
Jean