Darryl, Justin,
It is usually a good idea when doing a large upgrade to start out with a fresh app and start moving pieces of the application into the new app. Its recommended to do this piecemeal if you can and test your components along the way. This can be hard if you have a lot of intertwined components, but hey that's tech debt. Good version control and compare tooling goes a long way here.
With Grails 2.3.x, forked mode was introduced. I'd guess that you have some memory settings to tune in BuildConfig.groovy. Basically the app runs in it's own separate forked JVM without all of the Build-time libraries and dependencies, but you'll need to tune those JVM settings.
Extremely slow startup times can be an indication that you're approaching a memory threshold and thrashing with too many GCs - the OutOfMemoryError seems to corroborate.
There are some tools included with the JDK that might help you identify the app's memory constraints. Checkout JConsole or VisualVM, you probably have them installed already.
Hope that helps