I think a lot of the answer to this questions depend on what you mean by outsourcing. We're US based. If outsourcing means finding a US/Canadian/European programmer to contract a project vs hiring a US employee, I'd agree with many above that outsourcing can be less expensive than hiring, and equally effective.
But I think most people, rightly or wrongly, associate the term outsourcing with offshore outsourcing to countries with less expensive labor costs (Eastern Europe, South Asia).
In that case, obviously the cost is not comparable. Outsourcing of that variety dramatically less expensive, which is why most companies do it.
The great challenge, of course, is work quality and culture. Someone above noted that large, highly professional Indian outsourcing companies do a terrific job training people on skill, language, and work culture if their working for companies in, say, North America.
I'm sure that's true. For our part, any effort we've made to outsource has never worked. I suppose we just haven't found the right company or people. There have always been one of three problems - language and communication is difficult; skillsets for people we've hired have not been quite up to the same level as in-house folks; and often work culture / coding approach / problem solving culture is different; and actually just the timezone difference has proven to be an obstacle.
Given our globalized world, I think that pay rates have started to equalize for the same skill level. That is, if someone is a standard offshore outsourcing country is perfectly fluent in English, programs at the same level of proficiency as your in-house team, and has adopted the same kind of work culture - and this is now quite common - then contracting to them is basically no different than contracting to someone in the US. Pay converges to reflect value and while is still some price savings, it's not that dramatic.