``, system, eval and exec all do different things, so it's useless to compare their performance.
- Do you want the caller to wait for script.cgi to finish and resume execution after script.cgi is done? (yes: ``, exec)
- Do you want the caller to resume execution immediately after script.cgi is launched, letting it run in parallel? (yes: fork+exec)
- Do you want to capture the script.cgi's output? If you don't, it will go to STDOUT. (yes: `` and fork+exec+pipes)
Don't use eval. You'd have to change script.cgi to play nice, but it's easier and better to write script.cgi as a proper module instead.