why does UnityWebRequest want Dispose() ?

The Unity Docs state:

Signals that this [UnityWebRequest] is no longer being used, and should clean up any resources it is using.

You must call Dispose once you have finished using a [UnityWebRequest] object, regardless of whether the request succeeded or failed.

Why doesn’t UnityWebRequest rely on regular garbage collection ?

Same reason any operating-system level resource (file handles, sockets, etc.) doesn’t rely on garbage collection–web requests rely on system sockets, which should be closed manually to clear up resources when you’re done with them.

It’s a little misleading because actually they will get garbage collected eventually, e.g. when the game stops running. You have no way of predicting when this will happen, what overhead it may add, and you have no way of handling or even detecting any errors that occur while doing so. It is a best practice to clean up after yourself.

This is typical of any garbage collected environment.