Your workflow is a little... weird.
Have you seen this?
https://duet3d.dozuki.com/Wiki/Test_and_calibrate_the_Z_probe#Section_Calibrate_the_Z_probe_trigger_height
So here’s my workflow:
M561 turn off mesh compensation
That's fine.
M208 S1 Z-3
This isn't recommended. I understand what you want to do, you want to be able to get close to the bed, but changing the axis minimum probably isn't the best way to go. Either use G92 Z10 to tell the firmware you're higher than you actually are, or use M564 S0 to go beyond the set limits temporarily.
Baby step to the bed until it touches.
This isn't having the effect you want. You should be using the actual jog buttons or G1 Z movements to get it to touch the bed. The baby stepping is shifting the nozzle but not updating the actual position of the Z. This is why you continue to still have a weird offset.
G92 Z0
Once you've used the jog buttons to touch the bed, then yes use G92 Z0
M500 to save.
This does nothing in this context. M500 doesn't work like it does on 8-bit boards. In RRF it is used to save certain calculated or measured values to a text file that get read back at boot time when the M501 command is sent. It's mainly used to save delta calibration values or PID heater tuning results. It can be used to save a G31 trigger height, but not in the context you're using it here.
See: https://duet3d.dozuki.com/Wiki/Gcode#Section_M500_Store_parameters
G1 Z5
Yup, that's fine.
G30 S-1
Yup that's fine.
Repeat four times and average the result; then add to G31 in config.g
That's also correct except for the baby stepping.
When I probe before a print at temp, I do one G30 in the middle of the bed.
G29.
Also correct.
Once you have a proper G31 value for your probe I think you'll have a lot less problems.
Post your config.g and your homing files for good measure.