What is the difference between a dependency substitution and a module replacement rule

Continuing on my recent question about module replacement rules, what is the difference between

configurations
{
	all
	{
		resolutionStrategy
		{
			dependencySubstitution
			{
				substitute module('javax.activation:javax.activation-api') with module('jakarta.activation:jakarta.activation-api:1.2.2')
			}
		}
	}
}

and

dependencies
{
	modules
	{
		module('javax.activation:javax.activation-api')
		{
			replacedBy('jakarta.activation:jakarta.activation-api')
		}
	}
}

apart from the obvious difference that the former requires specifying a version for the replacement module, while the latter does not.

Both seem to do the same thing, except I don’t know precisely when to use which.

Also related to my previous question, both show no effect when used in a platform project, of which I conclude that neither is currently supported for platform projects.

Thanks!