1) why?
When you upload an image to Craft, the image is automatically “cleansed” using the same basic process that Craft uses to create image transforms. That happens to ensure that there are no malicious scripts hidden in the images, and it’s not something you can disable.
2) why is this not spelled out clearly in the documentation?
Good point... we should probably mention it in the Assets section of the docs, or perhaps a knowledge base article. Will look into it.
3) Shouldn't Craft alert the user that it's altering your image so you don't spend hours trying to figure out what happened to your carefully planned images?
It would get old soon, considering it happens for 99% of uploads.
4) how can I stop this from happening?
Nothing natively, but you can bypass the whole process by manually FTP'ing up the images and running the Update Asset Indexes utility so Craft picks them up.
Worth noting that you might be better/more consistent results if your server is using Imagick over GD and make sure you're running a recent version of it.
There is a setting to this for GIFs you can disable mainly because animated GIFs can contain hundreds of frames and transforming those can bring a server down. https://docs.craftcms.com/v3/config/config-settings.html#transformgifs