I love declarative testing tools like QuickCheck. They're excellent. I still test-drive my code though.
The reality is that programming is an engineering endeavor, and in the face of limited resources, we have to choose the tools that can offer realistic benefits now.
Formal verification is not that tool for most projects right now. Would instagram or even facebook be better off? Most people would, correctly, say no.
And ultimately in the end, nearly all software (including quite a bit of open source software!) is written in pursuit of business reasons, and has to answer to that.
http://mashable.com/2011/12/06/facebook-bug-zuckerberg-photo...
When I read about that bug in the past, I thought "this would be a great example to use for Alloy".
[0] http://www.doc.ic.ac.uk/project/examples/2007/271j/suprema_o...
* Leader election in a ring
* Hotel room locking (this one is really cool)
* Media asset library management
* Memory abstractions
[1] http://books.google.com/books?id=DDv8Ie_jBUQC&lpg=PP1&dq=sof...
Furthermore, I think that you're ignoring that TDD tries to be a practical solution to certain real-world problems. This means that trade-offs are made in the name of creating software that works sufficiently well, while keeping expenses in check.
Sure, extensive formal verification of all software would probably bring some benefit in terms of correctness and perhaps security. But you're not considering the cost involved.
So far, such verification has only proven to be possible in rather limited situations, namely where there are significant resources available, or in academic exercises. Maybe this will change in the future, but in the present it's generally far more cost-effective to use a statically-typed programming language along with some form of automated testing. That gives many of the benefits of more formal methods of verification, but while also avoiding many of the costs, even if the end result doesn't conform to some theoretical idea of "perfection".