In my experience, failure can be detected in seconds and switched over. Adding a reverse ARP setup to share a virtual IP for the clustering servers, the clients won't even have to talk to a different IP in the case of failover. The only case the clients need to handle is to retry upon failed connection, which they should have handled to deal with the occasional network failure.
Grown-up vendors have had this solved for decades, literally. E.g. http://en.wikipedia.org/wiki/IBM_Parallel_Sysplex
PostgreSQL: Comparison of Different Solutions http://www.postgresql.org/docs/current/static/different-repl...
as well as the rest of chapter 25..
That being said, I'm 100% in agreement with you that the two options you supplied would be wonderful additions to our environment.
Distributed Queues, Pub/Sub, Gossip just a few that come to mind.
In your example, you are using what is called a classical three-tier web architecture - a Load Balancer + Stateless Nodes + Scalable Storage. The most interesting part of HA setup in a three-tier web architecture is HA setup of the persistent storage component. It looks like you actually haven't figured that out that piece yet and are waiting for a vendor (Microsoft) to solve this for you.
You can improve availability of your persistent storage (MSSQL) in several simple (or not so simple ways):
1. Use a SQL proxy load balancer (or a cluster setup) - a similar load balancer HA pattern you are already using
2. Shard. You will scale writes and significantly reduce the probably of your system becoming completely unavailable.