Uno resets when using Serial.print() - memory problem?

Before moving all my text into PROGMEM, I was using 75% of dynamic memory; afterwards, I'm using about 25%, so the saving is significant.

Yes, moving the strings was important. But, you added pointers to the strings, which point to the location in PROGMEM, and then you moved the pointers into PROGMEM. THAT saved very little SRAM, for all the extra work you need to do, fetching first the pointer and then fetching the pointed to data.

I'm not sure it's a case of accessing the data incorrectly - I haven't changed the access method (i.e. Serial.print()) between the non-PROGMEM version and the PROGMEM version.

Serial.print() knows how to print data from SRAM. It does not know how to print data from PROGMEM. So, first you must access the data for it to print. But, that data is in PROGMEM, and so is the pointer to it. So, you need to get the pointer from PROGMEM, and then you need to get the data that it points to from PROGMEM. So, it IS a matter of accessing the data incorrectly.