My experience matches yours. The key is GOOD people. Finding good people is hard.
I know someone who has been trying to hire a few good people for awhile now. In between interview 1 and 2 he sends them home with a coding problem. IMHO, it's too basic, but it's just a simple "implement a few design patterns" so that the company doing the hiring can see the programmers style and if they know what they are doing. The goal is to have something to talk about in the second interview. Many of the responses he gets back do not even compile (think about that for a second...the candidate has the full internet at their disposal). The ones that do compile look horrible (editors have auto-format - use it!) and/or don't meet the very simple requirements.
And offshoring really is broken. It can work for a very particular set of project types (basically ones with strictly defined requirements), but even then it's hit or miss. India is really too expensive now, especially if the cost of communication, time zones, culture, and remote management is factored in. Philippines is big now, but with good people there pulling $30k+ and being poached from company to company it's impossible to build any tenure into your people. It seems everyday I talk to a CTO or director who has a story of throwing away lots of money on offshoring with nothing to show for it.
The problem, and you touched on it, is that every company needs software people that not only know software but also know and learn the company. Only then can the real value add company software be created. This requires good people and is very hard to do with outsourcing.