execonly returns the last line of the generated output.shell_execreturns the full output of the command, when the command finished running.systemimmediately shows all output, and is used to show text.passthrualso returns output immediately, but is used for binary data.passthrudisplays raw data.
With both exec and shell_exec it is possible to handle the output yourself, while system and passthru won’t let you customize it and immediately display the output.
A more detailed comparison can be found here.