Most practical SoCs are more than just a collection of IPs and custom development. There is a clear hierarchy associated with the IPs that are used. For example, an SoC might instantiate 8 USB ports, but each port needs a USB phy and a USB controller. Further, this SoC might also need to instantiate other IO like PCIe or SATA etc. All those individual functions require their own controllers, PHYs etc.