The main reason is it is impossible to deterministically determine the execution time of a transaction without heavy overhead (e.g. gas metering).
For example, user send a transaction, the execution time is 10ms on the block producer Alice. Alice created the block, charged 10ms worth of the tx fee and broadcast the produced block. Other fullnode needs to validate this block by replaying it, and remeasure the execution time. For various reason, Bob may need 20ms to evaluate this tx. Should Bob reject this block because it is under charging? How could Alice proof the execution time is 10ms?
Could a valuator just say I have this magic computer that can execute all the transactions in 1ms and under charge the tx fee to DOS the network?
Could a valuator just say hey my machine for some reason requires 500ms to execute this tx so I am going to charge you 500ms instead of an executed execution time of 10ms.
Weight functions provide a way to provide a reasonable estimation of the execution time of a call that is deterministic and reproducible.
Of course, you can do gas metering just like any other smart contract chain. But you will also need to pay for the overhead of the gas metering, which are significant.