Is the process of indexing transactions by assigning a transaction id necessary, or is it a scalability issue? Is it not possible for users to simply sign "send transaction" messages into the blockchain with a value field and an address field, and have the validators do the work of looking through the blockchain and adding up all of the send transactions to validate that the coins actually exist? I am hypothetically assuming coinbase transactions still exist and simply list outputs to recipient addresses, thus crediting these addresses with new coins.

Is a transaction id simply a tool to help achieve scalability? Why do transactions have to reference previous inputs?
The reason you have to explicitly state which previous outputs should be claimed by a transaction is simply that you do not want to give users on the network a blank cheque. Say you wanted to transfer 1 bitcoin to from any output available to address A to address B. You would then create a transaction that looks like this:

amount=1|to=B|sign(amount=1|to=B, sign_with=A)


This transaction would be broadcast to the network and result in the desired result. The main problem is that if you have more than the 1 bitcoin you'd like to spend, there is nothing to prevent the owner of address B to create more transactions that give him all of your bitcoins.

The second problem arises with the change from that transaction, if you do not have outputs that sum exactly to 1 bitcoin, you implicitly create a new output for the change. This brings us to the last problem: picking outputs to spend may not always produce the same outcome. If there are multiple combinations that the new output to B can be constructed then nodes in the network would have to agree on which outputs to spend, which again would require transaction IDs.

Having the owner of the coins specify which ones to spend simplifies all these problems.