Don't think of them as separate scripts, but rather as 2 parts of the same script. The software executes both scripts using the same stack, so it's like they were concatenated and run as one. The advantage is that it's the same code that executes each script.
However, you are correct in suspecting there is no reason to have anything other than serialized values for
scriptSig, at least with most scripts. With a stack based language such as Bitcoin's script, there are no variables or memory allocation. The only way the results from an earlier part of the script can affect the rest of the script is to push values to the stack to be used as inputs of other operations. This means it is pointless to perform any operation in
scriptSig other than pushing values to the stack. As such, transaction inputs that use operations in their scripts are considered non-standard.
The exception to this rule is the multisig script type, which needs to push an extra value onto the stack due to an unfortunate off-by-one error in
OP_CHECKMULTISIG. Even so, the
OP_FALSE that is used in a multisig
scriptSig only pushes values to the stack. That is all a
scriptSig should ever do.