What is an effective way of colliding but passing through another surface?

Consider that I have 3 surfaces, upon collision; the first surface slightly slows a rigidbody but allows it to pass through, the second surface slows a rigidbody even more but also allows it to pass through, while the last surface would completely prevent a rigidbody from passing through and would rebound the rigidbody.

The slowing down of the rigidbody is straight forward, what I am not quite sure about is what is the best way to have these collisions triggered. I would like to use OnCollision so that I can get detailed information about the rigidbody and surface hit; such as the angle of impact, velocity at impact, collision magnitude etc. But for OnCollision I would need to use colliders and I am wondering how to make a rigidbody pass through a collider and still give collision hit information? I suppose that the other option is a raycast but in my past experience using raycasts with very fast moving rigidbodies is not very reliable. Lastly, triggers would make the passing through straight forward but they do not provide detailed hit information as far as I know.

Could someone please advise what is an effective way to achieve this.

Why not use OnTriggerEnter?

If you want to get collision information & also allow an object to pass through it, simply make the collider on the surfaces act as a trigger. There is an Is Trigger checkbox in your collider component(see in inspector). Now use OnTrigger to control the behavior on collision. This time the object will be able to pass through the collider.