Honestly, after a few weeks of pounding on a few dev boards I can say that CMSIS isn't a big deal. It's not a do-all library for generic cortex development. It's a library that encompasses the very fundamental parts of the Cortex that are common across all the processors like the NVIC, SysTick timer, etc. After that though, all the peripherals are still different for each vendor.
There is nothing to guarantee that the GPIO registers are at the same memory address on an NXP chip vs a Texas Instruments chip, and even if they were there's no guarantee that the registers will be the same so you can't just write generic code that will target all processors.
The best solution so far seems to be to just get as low to the registers as you can. If you write low level enough code then porting your code from one uC to another will be a matter of leaving the logic the same and switching out registers and addresses. That's probably as close to vendor independence as we'll get any time soon.
I will still avoid using any vendor specific libraries. It's easy enough to port code when all you need to do is swap out register names and values. Once you abstract that into driver libs then you've got to modify a lot more code (in my opinion anyway).
So if anyone is looking to get started coding for an ARM Cortex processor, honestly right now the best thing I can point you at is a good set of AVR programming tutorials available at http://newbiehack.com/
-- they are AVR specific but the code is generally presented at a low enough level that the concepts will easily transfer over to ARM development. There are differences in how you work with interrupts and the port assignments are different, but for the most part the code and ideas behind the code port over very easily. Even for someone like me who has precious little prior experience with ARM-C.