This sounds exhausting, honestly. You’re not dealing with someone who just has a few nitpicks, you’re dealing with someone who fundamentally dislikes cruising but keeps agreeing to it anyway.
At some point it’s probably worth taking the emotion out of it and naming the pattern out loud. Not during the cruise, but afterward, calmly. Something like: every time we cruise, you start out excited and then end up miserable, and it affects the whole family. That doesn’t make her wrong, but it does make repeating the same trip unfair to everyone involved.
A few thoughts that seem to come up with couples in this situation:
Some people don’t actually hate cruising. They hate feeling trapped. Once the ship leaves port, there’s no escape, and that can trigger anxiety that comes out as anger or criticism. If that’s the case, cruising may never be comfortable for her no matter how “good” the ship is.
If she truly hates cruising, then it’s okay to stop forcing it to be a “family” thing every time. A family vacation doesn’t have to include everyone every single trip. One parent sitting out a cruise while everyone else goes doesn’t mean the family is broken.
If she insists on coming, boundaries matter. That can mean agreeing in advance that she’s free to skip activities, but not to constantly vent to everyone else or pick fights with staff. It’s reasonable to say you’ll listen, but not endlessly absorb negativity.
You’re also right on gratuities. That’s not something to punish staff over.
Long term, alternating vacation styles might be the healthiest compromise. One year a cruise for those who love it, another year something land based that clearly suits her better. If cruising once a year is important to you, it may need to be framed as something you do without expecting her to enjoy it, or without her coming every time.
This isn’t really about cruises. It’s about mismatched expectations and how much one person’s unhappiness is allowed to dominate a shared experience. That’s a bigger conversation than any ship or itinerary.