Earlier quoted context omitted.
From what I understand, Apache doesn't send them to bash. It sends the to whatever binary is configured to handle the request (using CGI), which were then calling bash unbeknown to Apache (but implicitly passing the same environment variables).
Lots of functions to start another process start a shell instead and is a command line to be executed, e.g. system or popen. The convenience in that case is that you don't need your own handling of $PATH or wildcards or argument parsing. It's pretty standard on UNIXoid systems.
You don't with execvp or execlp either.
> or wildcards or argument parsing.
IMO this is of dubious value from, say, a C program. Why "parse" the args? Just generate a list...