Also, split up some of your diffuses that can be grayscale into each of the 4 channels of a texture2D, RGB and A, this way you can have 4 diffuses in one texture, then just add color using other nodes.
You can also generate fake normal maps from grayscales using the NormalFromHeightmap function and you can get rid off the blue channel in many of your normal maps and use the DeriveNormalZ expression to get a decent result without it and save a channel for use with something else.