UB is bad when it's *inconsistent*. Making it so that your
creation/allocation and destruction/deallocation have to match is
consistent. Making it so that inconsistent code sometimes works
doesn't make the language easier to learn. It just adds complexity in
the name of... what, exactly? 
 
Not. It is still not recommended (but sometimes it is really needed), but if someone really does it, it should not be UB.

Can you give a reason why such a rule ought not be followed? Show me
actual good code that doesn't follow this rule. Not just code that
technically works because of some statement in the bowels of the
standard, but code that has some kind of advantage that is arguably
more important than having a simple rule everyone understands and can
easily follow.

In fact, it is very simple, when the storage to be allocated is larger than the object occupies. inlined_fixed_string in P0722R1 is an example,  It uses new (::operator new(full_size)) inlined_fixed_string(data.size(), data.c_str()) to allocate and delete-expression can be used to deallocate.