Unbelievable. Whoever is in charge of the Arduino website needs to make a note of that in the online Reference. A simple one sentence note on the String class ("String currently contains deadly bugs") would have saved me a ton of grief (and other people, I imagine).
As far as the memory limitations, I thought that might be the issue so I tried using the little get_free_memory() function posted here: http://forum.pololu.com/viewtopic.php?f=10&t=989&view=unread#p4218. It didn't indicate much of a problem, but obviously it can't run within sprintf() or help me detect memory handling bugs.
Anyway, in hindsight it seems like avoiding use of the heap in general seems like a good idea. I'll try out the PString and Streaming libraries, it seems like they might provide a much better starting point than String anyway.
Thanks for the responses! (And sorry for the sloppy reading of the "before you post" thread, ... but I did read most of it!
)