Why rebuild for changes like upload_port?

There are edge cases which affect compilation, e.g., you can engineer a script that takes the upload_port value and makes it available to the firmware code as a macro, based on which the firmware can choose to have an entirely different behavior (How could the main.cpp read the parameters at platformio.ini? - #3 by maxgerhardt), and hence the safe choice is to always fully recompile.