If you mean you are writing a module containing declarations that are conditioned on whether other classes or modules have been assigned to the target node's catalog, then my first and best advice is to abandon that idea altogether. As a general rule, such declarations do not work reliably or well because the results of the necessary conditional tests depend on the order in which they are evaluated relative to other declarations in other manifests, and that order is very difficult to predict. Instead, use Hiera or an ENC to dynamically specify the needed classes for each node.
In Puppet jargon term "autoloading" refers to the mechanism by which the catalog compiler locates the manifest file in which the definition of a given class or defined type resides (supposing that you have followed the layout conventions that allow it to do so). That doesn't seem to be what you mean by the term, so if your meaning matters to the question then it would be to your advantage to explain.
I haven't used tagged() much (or at all, really), but I don't think it does what you seem to think it does. The docs say it "tells you whether the current container is tagged with the specified tags", where the usual meaning of "container" in Puppet is a class, node, or catalog, so that function will not inform directly about whether a class other than the one in which the function call appears is tagged with the specified tag. Because objects inherit tags from their containers, however, it will indirectly inform about whether the object in which the call appears is declared by a class bearing the specified tag (recursively). Classes can be declared multiple times in multiple places, however, so I cannot see how the function result could fail to be evaluation-order dependent.
In any case, be aware that classes are automatically tagged with every segment of their own qualified names, so yes, class collectd::client:plugin::apache will always bear the tags "collectd", "client", "plugin", and "apache" (among others) as will every object declared by that class. I wouldn't expect the tagged() function to reject the tag "::apache", but that particular tag won't be present on any object unless you've set it explicitly. None of that should not directly affect class collectd::client::autoconfig, though. The only way it should see a tag 'apache' is if it is declared within a container bearing that tag. Do you mean to say that class collectd::client:plugin::apache declares class collectd::client::autoconfig? If so, why?
John