In protocol 003_PsddFKi3, how can the gas and storage usage be calculated without doing a dry-run in a node?
According to the official documentation available here you can get the gas and storage cost of the operation you plan to broadcast to the network by passing the parameter
--dry-run to the client node
Quoting the doc it mentions
Another important use of validation is to determine gas and storage limits. The node first simulates the execution of a Michelson program and takes trace of the amount of gas and storage. Then the client sends the transaction with the right limits for gas and storage based on that indicated by the node. This is why we were able to submit transactions without specifying this limits, they were computed for us.
So officially there's indeed no alternative way short of implementing your own validator.