It's a very late answer and I'm sure the original poster no longer needs this, but the problem is common enough and still exists.
One way to achieve this is to use gerbv
to make the various layers, then Image Magick's montage
and convert
programs to create the file you want.
The basic idea is to use gerbv
on the command line to generate intermediate images; the rest is ordinary graphics not specific to gerber.
gerbv gerberfile.gbr -xpng -o tempfile.png
In Linux or similar shell, scripting that is pretty straightforward.
Here are parts of an image showing stacks on the left (just copper and solder mask, red=top, blue=bottom) and the silkscreen of those layers.

Script:
#!/bin/sh
# gerber2pdf
# convert gerber files to review pdf
# jonathanjo/2020-06-01
set -e
if [ $# -ne 1 ]; then
echo "Usage: `basename $0` filenamebase" >&2
exit 1
fi
fn="$1"
tcopper='#ff0000'
bcopper='#0000ff'
mask='#ffffff40'
silk='#ffffffff'
outline='#ffff00'
pcb='#004000'
dpi=1000
tmp=/tmp/$$
for x in COPPER-TOP SOLDERMASK-TOP SILKSCREEN-TOP \
COPPER-BOTTOM SOLDERMASK-BOTTOM SILKSCREEN-BOTTOM \
OUTLINES; do
f="${fn}_${x}.gbr"
if [ ! -f "$f" ]; then
echo "`basename $0`: $f: no such file" >&2
exit 1
fi
done
gerbv -D $dpi -B0 \
-b$pcb \
-f$mask ${fn}_SOLDERMASK-TOP.gbr \
-f$tcopper ${fn}_COPPER-TOP.gbr \
-f$outline ${fn}_OUTLINES.gbr \
-xpng -o $tmp.topc.png
gerbv -D $dpi -B0 \
-b$pcb \
-f$mask ${fn}_SOLDERMASK-BOTTOM.gbr \
-f$bcopper ${fn}_COPPER-BOTTOM.gbr \
-f$outline ${fn}_OUTLINES.gbr \
-xpng -o $tmp.botc.png
gerbv -D $dpi -B0 \
-b$pcb \
-f$silk ${fn}_SILKSCREEN-TOP.gbr \
-f$outline ${fn}_OUTLINES.gbr \
-xpng -o $tmp.tops.png
gerbv -D $dpi -B0 \
-b$pcb \
-f$silk ${fn}_SILKSCREEN-BOTTOM.gbr \
-f$outline ${fn}_OUTLINES.gbr \
-xpng -o $tmp.bots.png
# many variants of the following also sensible
montage -geometry +10+10 -label '%f' \
$tmp.topc.png $tmp.tops.png \
$tmp.botc.png $tmp.bots.png \
${fn}.png
convert ${fn}.png ${fn}.pdf
rm -f $tmp.*
# end