Rigidbodies are required when you want the engine to handle collision detection for you. If you want to prevent your character from walking through other objects with colliders (like walls), then you either have to check for walls in your own movement code or you need to add a rigidbody to your player.
And if you want to use trigger areas which do something when the player walks into them, then that's another reason to add a rigidbody to the player, because that's a requirement for causing OnTriggerEnter events. For more information about the Unity collision rules, check the tables under "Collision action matrix" in the manual article about colliders.
Now about how to move your rigidbody. I created a little demo game which demonstrates the effects of different ways to move a player-character. You can check it out on itch.io.
When an object has a non-kinematic rigidbody, then you should generally not manipulate the transform directly. When you change the transform, you are not moving the object, you are teleporting the object. This ignores collision and can cause weird effects if you teleport an object into another object with a rigidbody.
If you want physics in your game (objects pushing each other and getting pushed in a physically correct way), then the cleanest and most recommendable way is to control objects with Rigidbody.AddForce. When you feel like your objects behave too much like they are gliding on ice that way, increase the drag value of your rigidbodies. The result will be that your objects move with a bit of momentum, which often looks and feels pretty nice.
If you are looking for something in between the physically correct movement of handling forces and the tight control of manipulating the transform, manipulate the velocity property of the rigidbody. That way you still have collision handling and can push things, but the object itself won't behave in a physically corret way when interacting with other objects.