A monolith becomes painful when two teams cannot deploy because they share a release. The fix is not a diagram of twenty services. It is a boundary around the code that already changes on its own.
I started with the flows that had their own data and their own deadline: payments, notifications, and the HR APIs for records, time and benefits. Each one got a versioned contract. Callers kept working while the implementation moved.
Queues took the place of in-process calls where a failure in one area used to roll back the other. Teams could ship a service without waiting for the rest of the suite.
The HR APIs are the current version of that work. Legacy pieces came apart along those lines, and p95 on the key workflows dropped by about 40% once the hot queries and the cache were no longer stuck behind the monolith.