Is backward compatibility the main reason?
No.
The purpose of forwarding reference is to avoid code duplication, and forwarding reference will not bring any performance improvement.
First of all, std::queue<T, Container> is just a wrapper of Container, which can be regarded as a Container that is restricted to using only some functions. Therefore, std::queue does not need to implement the detailed logic of push, it only needs to forward push to Container::push_back.
Since std::queue's push only takes 3 lines, there is no need to use forwarding reference. In addition, forwarding references can lead to other problems:
If push really looks like this:
template <class T>
void push( T&& value );
You can observe that since the forwarding reference uses a template, users can pass arguments of any type that is not value_type without immediately triggering a compilation error.
For a real container like std::deque or std::vector, the implementation of push_back typically also just forwards to a push_back_impl that uses a forwarding reference and does all the heavy lifting there.
PS This push_back_impl is usually emplace_back
Related: Why couldn't push_back be overloaded to do the job of emplace_back?
emplace, in case you want to avoid moving the pr-value.