One very common way of publishing "directly" to a queue is to use the default exchange, which
requires that routing key is set to the name of the target queue. When your target is a queue,
plugins often choose that way over declaring their own exchanges and setting up bindings.
I'm afraid we cannot suggest what you should do: we know very little about your system and its
goals.
You can take a look at exchange-to-exchange bindings:
They provide a lot of flexibility at the cost of some extra complexity. My reading of your post suggests
you may be already aware of them/using them.
There is an alternative to Shovel: write your own app in any language you please that does exactly
what you need.
Shovel is a really basic tool: it consumes messages from a source (usually an existing queue; could be a temp queue bound to an existing exchange) and publishes
to the a destination.