I managed to suppress the exceptions with a pretty sloppy workaround. Hopefully it will help someone else coming along, but if anyone has another solution or any insight into the problem, I would love to hear it.
Anyway, you want to call merge() rather than save() when appropriate. I don't know how to determine if an instance is referenced across multiple sessions, so I just wrapped each save in a try-catch block and then call merge() if there's an exception. It's not the prettiest solution but it works.
def customerService = AH.application.mainContext.customerService
instance.customer = customerService.retrieveCustomer instance
instance.name = instance.customer?.name ?: instance.domain?.tokenize('.')[0].capitalize() ?: ''
Instance.withTransaction{
try{ instance.customer.save() }
catch (Exception e) { instance.customer.merge() }
try { instance.save() }
catch (Exception e) { instance.merge() }
}