Is there a "proper" way to pass information between shaders?

Not in Godot, the closest thing to getting data back from the GPU is with a compute shader.

I want to summarize your objective, but I don’t really understand.

How Godot 2d renderer works to my knowledge is there are two stages.

The first stage each canvas item is drawn in order. The second stage is a back buffer that can return the final image for post processing, kind of like a second pass at the cost of frame delay.

See here about screen reading shaders.

There are only uniforms to get custom values from CPU to GPU. But this is a one-way process as there is a cost to return data from a GPU.

Compute shaders can give you this iterative control. Or you can have work groups do one pass then pass it on to the next work group, in one go. kind of like the varying variable can pass values between individual process functions within a single shader. I have seen people use compute shaders to do ray traced light so syncing it should be doable.

Godot has recently added Compositor effects, but I haven’t really understood them, and I remember reading that it only supports 3d rendering.