I'm not entirely sure what you are asking for, but it sounds like the user being able to view/edit source and see/change hidden fields is not acceptable.
Using PHP sessions is the usual way to handle state server-side instead of client-side. But you mention sending to a CGI on another server, and PHP sessions don't work across multiple servers like form variables do, so that won't work.
You could use hidden form fields, but encrypt the data. That requires the CGI on the other server know enough to decrypt it. Also, encryption is often trickier than most people expect, and novices often end up with systems that look secure but have subtle vulnerabilities (even using established algorithms).
I would suggest having your PHP script interact with the remote server, instead of having the client browser do it. Basicly, the client browser should interact with your PHP, and your PHP should make the actual connection to the other server. Then you can pass your secret form variables directly to the other server, without passing them through the client. From the user's perspective your PHP script is just a front end for the remote CGI. The user doesn't even have to be able to access the remote CGI, or even be shown any evidence of its existence.