Can anybody explain why they would use background threads? Seems like over-engineering. Don't iOS blocks natively perform tasks asynchronously?
The blocks themselves don't, no, they're just anonymous functions.
I'd hope NSOperationQueue[0] and maybe GCD composes most of what they mean by "use background threads".
And as sandyarmstrong notes, using things like operation queues will still impact your performances more than separate threads, as the main thread's runloop will still have to go through them, stuff like that.
[0] Which can take a block if an NSOperation is too much overhead for the work, see addOperationWithBlock:
Between blocks and NSOperationQueue this all feels pretty natural in iOS development. You're not explicitly managing thread creation, etc.