Perhaps an oxygenated-bleach like OxiClean. It acts like hydrogen peroxide when combined with water, not like a harsher "chlorine" bleach.
Contact cleaner is powerful stuff. I've found it works better than engine degreaser, which is why sometimes I use it that way on oil grime on the undercarriage. But it's too expensive by volume to do so regularly.
I'd also avoid anything abrasive like a melamine sponge (Magic Eraser). Most headliner fabrics are too delicate.