In cases where a servlet is actually tied to a web component on your websites, you can change your servlet to be configured with `sling.servlet.resourceTypes=<resource type of your component>` and then change your front end calls to instead be a URL directly to the component. When your servlet is tied to your component, this is generally advisable, because in a multi-site situation this ensures the path of the request includes the root path of the current site, which allows your service to ensure it's response is contextual to the site.
That said, if you truly have servlets that need to answer on static paths, I think what you can probably do is effectively achieve the same thing as above by adding some `nt:unstructured` nodes to your JCR that have a declared `sling:resourceType` that you can then reference in your servlets (same way as if they were real components).
As an example, say you have a servlet with path /api/myservice right now. In your jcr add:
/content (default AEM folder for content)
-> /api (type: nt:unstructured)
->-> /myservice (type: nt:unstructured, sling:resourceType: "/servlets/abc")
And then in your Servlet, instead of configuring:
`sling.servlet.paths="/api/myservice"`
you have
`sling.servlet.resourceTypes="/servlets/abc"`
This then allows ACL's to be set on the `/content/api/myservice` node to govern access to your servlet, if desired.
NOTE that you'd need to call AEM with the full path `/content/api/mysevice.json` for example, which you can alter in your dispatcher configs (e.g. shorten to /api/myservice) for external use.
Maybe not everything you need, but LMK if this helps.