It does not change anything. Both old and new categories are still enumerated when I call getProductCategories().
I'm going to try to set a new product categories collection.
$collection = new \Propel\Runtime\Collection\Collection();
Yep. Saving the product after add/removeCategory and setting a new ProductCategories collection does the expected job. Thank you for your help.
I'm just concerned about why the old category is still enumerated after calling removeCategory. If removeCategory is not supposed to dynamically update the productCategories collection, then that's ok, it's the appropriate behavior. otherwise, it might indicate another problem somewhere, and then, my "$productCategories->setDefaultCategory(1)" is a bit hacky. But it's good enough for what I need to do.