Context: People usually moves the character using rigidbody.velocity, but I want to have more controll over the movement and interactions. So, I want to create my own character controller. The most common way is to use raycasts to check collisions with obstacles and move character with transform. However, I ran into a problem when thinking about collisions with other controllers (like enemies, for example), because raycast does not trigger collision events (OnCollisionEnter… etc).
So I would like to know the best way to do this, but I have some doubts. To clarify, take this situation:

You have super Mario and a Goomba. If mario jumps on goomba, goomba dies. The correct way to do this is to have the Goomba check if something bumped into him, if that something was Mario and he came from the top, then kill the Goomba. If it’s Mario but it came from the sides, then kill Mario.
For 2D Physics only:
If both Mario and Goomba are using raycast-based character controllers, they will not register collision because they don’t have collider attached to them. So I thought of two ways to do it:
1 - Put a collider on Mario and Goomba and use raycasts to check the collision (like OverlapBox on Goomba).
Problem: In 2D Physics you shouldn’t move a collider without a RigidBody2D.
2 - Put a Rigidbody2D on Mario and a collider on both Mario and Goomba.
Problem: In 2D Physics, you shouldn’t move a Rigidbody2D with Transform.
So, how to procede? If I want make this kind of mechanic I will need a collider anyways (for raycasting), but if I need a collider I will need a Rigidbody2D, and if I need a Rigidbody2D I will need to move the characters with Rigidbody2D functions.
The way I think would be to control the character with Kinematic Rigidbody2D, enabling “Full Kinematic Contacts” and then use raycasts for wall collisions and collision events for Goomba. Is this the best way then?
For 3D Physics only:
Since moving static colliders doesn’t incur a penalty anymore (since Unity 5), could I just add a collider for Mario and move normally with Transform? And then add a collider to Goomba and check the collision with raycasts (like OverlapBox in Goomba)? Or is still better using a Kinematic Rigidbody and enable “Enable All Contact Pairs”? And then, dealing with wall collision with the way I was doing with raycasts.
Or… just don’t use physics? Because, in this kind of game, I just want to move my character in a unrrealistic way. And people say (Unity itself say) that if you don’t need to use physics, don’t add Rigidbodies. But what does it mean to not need physics? Technically collision detection (even as simples as Mario and Goomba) is use physics, right?
If anyone knows about creating your own character controllers I would love to know.
Thank you all!
(if you need more context just tell me)
Extra: If I need the Player to be pushed by a moving obstacle (like some Mario games), I would have to program this interaction or is it better to use Dynamic Rigidbodies?