Authors can delete files, releases, or projects but can never re-upload an already uploaded file, even if they delete it. It is discouraged to actually do this though (and in the future we may change it to a soft delete that just hides it from everything with the ability to restore it). It is discouraged for basically the reason you mentioned, people pin to specific versions (and sometimes specific hashes) and we don’t want to break their deployments.
Disk space is super cheap. We’re currently using Amazon S3 to store our files, and the storage portion of our “bill” there is something like $10/month for all of PyPI (out of a total “cost” of ~$35,000/month). Almost all of our “cost” for PyPI as a whole comes from bandwidth used not from storage.