Is Ethereum essentially Bitcoin with a Turing-complete scripting language and, if I understand correctly, where the script to be executed (not its hash) is placed in the Ethereum blockchain?
That's a bit of a simplification, (Ethereum has other improvements like GHOST) but for our purposes (discussing how a Turing complete scripting language could be implemented) it's essentially accurate.
If so, why doesn't Ethereum just put hashes of its scripts in the Bitcoin blockchain, send the scripts to be executed through another secure means such as via a P2P network (which would greatly reduce blockchain bloat), and avoid being an altcoin altogether?
One of the important features of Ethereum is that you can condition spending funds on the output of a script. For example, you could write a lottery script that accepts money from a bunch of different people, and randomly sends all of the money to the winner. Imagine that we change this system so that only the hash of the script is included in the blockchain:
If it's not a consensus rule, then other nodes will accept a transaction that doesn't satisfy the attached script. In other words, if nodes can't see the entire script, how can a node know whether someone claiming the lottery winnings is actually authorized to do that?
If it is a consensus rule, that introduces a new set of problems. First, in order to tell if a block is valid, you need to download the scripts from the P2P network, and check that all of the scripts are valid. That increases the amount of time it takes to verify blocks, and therefore increases the amount of orphan blocks.
The second problem that this introduces is that full nodes synchronizing for the first time need these scripts, or they won't be able to check that the blocks are valid. Therefore, the scripts need to be stored indefinitely, in case new nodes join the network.
This doesn't really solve the blockchain bloat - it just moves the problem around.
There's one more solution that does use the Bitcoin blockchain, though. You could follow Counterparty's example, and create a system where you send a Bitcoin transaction with additional metadata to identify it as a colored coin. You don't change transaction validity rules on the main network; rather, you say that if the transaction doesn't follow certain rules, then it is not a valid TuringCoin transaction for the purpose of establishing ownership of TuringCoins. (Other TuringCoin transactions within the same block would still be valid, though.)
That's not an altcoin in the traditional sense (you're using Bitcoin's blockchain, and you must pay Bitcoin transaction fees) but it is an altcoin in the sense that you're creating your own token that isn't fungible with Bitcoin.
If not, is the gas limit the real distinguishing feature of Ethereum compared to Bitcoin?
The gas limit in Ethereum is present for essentially the same reason that people have proposed making transactions in Bitcoin larger than 100KB invalid: otherwise, it becomes possible to create a block that takes a really long time to validate.