Employing something like
the COLORMAP used in IDEngine1 for palette entries except with full RGB support for the different light levels of the respective palette entry* would likely be a good solution to this problem.
* - the actual COLORMAP implementation uses palette entries that would visually look like a grayscale image with the pixel brightness indicating the palette entry number. This means we can't do anything we want since ultimately we're dictated by the palette. :^(So as an example, here's the stock Doom colormap:

Each pixel in the topmost row represents the raw palette indexes from 0 (leftmost) to 255 (rightmost), with every pixel downwards being a drop in light level.
Do note all the duplicate colors due to the lack of colors to represent the darker shades in the palette.

Here's a very quick & dirty "fade to black" approach in 24 bits (not restricted to just the palette entries)
But here's the thing - we can do
anything we want in all of those different light levels.

(also includes a different blue because the default one sucks)
Which of course also means that we can do some color tinting as we approach the darker shades;

And I'm bringing this up because it seems like a way to do what you're looking for, while also providing a funky tool for modding.