You could try using Physic Materials and customizing properties. Also, the second param of AddForce is the ForceMode - you could try a different ones. Also, you can change whatever properties of Rigidbodies and/or Colliders in the collision functions (OnCollisionEnter, OnCollisionExit, OnCollistionStay), …and you might also try experimenting with Contact Modification .
If all else fails, you could create an invisible object (renderer disabled, or even none or all) and give it a unique layer, disable that layer from hitting your player layer and whichever others in the Physics tab of project settings. This gives you a “collision only” object to move around that - control it however you like for purposes of determining whatever you need to know, and based on difference between that object’s position or velocity or whatever vs. corresponding values on your player, you might enable/disable specific parts of your code, use MovePosition briefly instead of force when it’s appropriate or necessary to (based on your own conditions, which might include some raycasting/spherecasting to get further info).
Finally, if you end up back at MovePosition being the solution you’re most comfortable with for whatever reason, you could try using SphereCastAll (“[…]to find out if an object of a specific size, such as a character, will be able to move somewhere without colliding with anything on the way.”) just prior to moving your player, though I would still suggest using physics forces instead if possible, so that getting bumped by other physics objects will affect your player’s motion as expected.