In Apple nomenclature, a private API is an API that your app is technically allowed to call, but that is subject to change at any moment and has 0 documentation and no backwards compatibility guarantees. If Apps were allowed to rely on those, they could just stop working across minor version upgrades or on new devices.
Those APIs are only there because they're needed by some higher-level system library that your app is actually allowed to use.
Sure, you could have all libraries be simple shims, all calls be interprocess, and all security be guaranteed by process boundaries, but that would kill performance.
If you only accept signed code and have W^X protections that apps aren't allowed to disable, this way is simpler, faster and just as secure.