You could parent the GUI to the camera. In multiplayer games, just hide the GUIs of the cameras not belonging to the current character before rendering.
There is also 3rd party solutions, one that looks pretty good is Sprite Candy.
Also, your second solution, with a camera far away from the character, is not tough at all. As a matter of fact, that is basically how I did my GUI here. The second camera is actually below the plane pointing down, and the GUI is drawn there.

This is how I set up the camera for the hud.
You just need to make sure that the GUI camera is created after the main camera so that Renderworld renders in the correct order. Beyond that, it's just a matter of putting your GUI elements in front of the camera.
There is also 3rd party solutions, one that looks pretty good is Sprite Candy.
Also, your second solution, with a camera far away from the character, is not tough at all. As a matter of fact, that is basically how I did my GUI here. The second camera is actually below the plane pointing down, and the GUI is drawn there.

This is how I set up the camera for the hud.
hud = CreateCamera() ;create the camera for the GUI CameraClsMode hud,False,True ;do not clear screen before rendering but clear z space, ;so it will be drawn over items from camera 1 but be able to maintain it's own z-order CameraRange hud,1,75 ;shorten the range for quicker rendering CameraProjMode hud,2 ;use orthographic projection CameraZoom hud,.04 ;This zoom setting seemed to work best for this program. PositionEntity hud,0,-50,0 ;put camera below plane RotateEntity hud,90,0,0 ;point camera away from plane.
You just need to make sure that the GUI camera is created after the main camera so that Renderworld renders in the correct order. Beyond that, it's just a matter of putting your GUI elements in front of the camera.