Use G10 to move your Z work offset forward; we do this all the time.
Leave G54 at Z0.0, turn your program into nested subroutines and write a small program that calls the subroutine after changing the work offset something like this for a part that is 0.5" thick including a parting and facing allowance.
Some stuff is missing from this example I am just putting in the G10 stuff to move the offset and call the subroutine.
O00000
G10 L2 G90 P1 Z0.0 (Make sure G54 is at zero)
G10 L2 G90 P2 Z-0.5 (Set G55 forward one part thickness)
G10 L2 G90 P3 Z-1.0 (Set G56 forward two part thicknesses)
G10 L2 G90 P4 Z-1.5 (Set G57 forward three part thicknesses)
G10 L2 G90 P5 Z-2.0 (Set G58 forward four part thicknesses)
M97 P100 L20 (The L is how many times you can advance the bar)
M30
N100 G54
M97 P1000
G55
M97 P1000
G56
M97 P1000
G57
M97 P1000
G58
M97 P1000
G54
All the stuff for feeding the bar to a stop
M99
N1000 Your program
M99
You start with a new bar brought out to your stop.
Go to N100 and using G54 go to your part program at N1000
Return, set G55 then go to your part program.
etc.
Feed the bar to the stop, return and go through all the work offsets again.
Run it in Graphics it is perfectly clear.
G10 is the 'enter offsets command', L2 identifies work offsets P1 is G54, P2 G55, etc.
Dead simple, very powerful.
I hope I got everything correct I did this very fast; ask it it does not seem to make sense.
An open mind is a virtue...so long as all the common sense has not leaked out.