The whole Ethereum VM is too complex. For a role like smart contracts you'd want something dirt simple with few operations and provability.
----------
bool isEntered = false;
function doSomething() { if (isEntered) { throw; } isEntered = true; ...; isEntered = false; }
----------
I don't really understand why they went with this gas-limit solution. I feel like there must be something I'm missing cause its too obvious.
The gas limit on send was more of a belt-and-suspenders thing, not intended as the sole protection; that may have been a bad idea in retrospect, but at the time people were pretty focused on adding every protection possible against another DAO situation.