contract-code gets executed IN a virtual machine during tx-processing; code can interact with the whole VM state & therefore needs to be synchronised between TXs, hence single-threaded
Well pipelining in CPUs can parallelize what can be parallelized by predicting/seeing data dependencies. And for multiple small programs, data dependencies probably more localized.