Kontakt has very CPU expensive effects that instruments can use. More often than not it's the instrument rather than Kontakt itself, since an instrument is a full on script. Kontakt's IR reverb is expensive and a few of the other effects are also costly. Then there is all the scripting, which can easily be a problem.
If it's not the script/effects, then there is the memory issue. Kontakt has some settings that control how much it loads of samples into RAM but instruments also have some control there. If your are swaping due to low memory it can really effect performance and cause crazy CPU usage. Each instrument in Kontakt will show how much ram it is using. It wouldn't take much with 23 instances to blow that ram budget.
If you are loading multiple copies of the exact same instrument you should load them all in a single Kontakt instance, since they can share the sample memory. If however every instrument has its own separate samples, multiple instances of Kontakt are better for CPU loading.
if your signature is correct and you only have 16GB of RAM, I'd take a hard look at that. I'd say you need at least twice that much RAM to do anything I'd consider a massive orchestral template.