Once it settled down, it wasn't a bad language, but with some EVIL
"gotchas" - very like Algol 68, but starting from the exactly
opposite approach to design

The things that killed it were its
lack of portability and poor performance
PL/I codes were very portable.
It was more portable than other languages, because
it wasn't necessary to write assembly codes to fill in
what the language couldn't do.
As for performance, that was good.
What users familiar with FORTRAN didn't take into account
was that PL/I codes contained their subroutines and functions,
whereas FORTRAN subroutines and functions were separate
compilations.
Codes with nested procedures took longer to compile than
without.
As regards run-time speed -- again, what was not understood
was the fact that PL/I arrays were (still are) dynamic, and thus
there was an overhead in allocating storage on procedure entry
(and de-allocating it on exit).
FORTRAN didn't have those overheads except at program start.
But then, FORTRAN codes weren't true algorithms, because array
sizes were hard wired. That limitation meant that tricks had to be
resorted to to try to overcome that deficiency, such as "adjustable
dimensions" and EQUIVALENCE.
What PL/I offered was the ability to run programs having large
arrays that wouldn't run in FORTRAN. By making use of
a number of BEGIN blocks (or CONTROLLED storage)
temporary and local arrays could be allocated and freed as required.
In this manner, the codes could be run in small core machines.
As to performance: there was a matrix scheme that took 1 to 2 seconds per job
compared to 75 seconds with anything else.
It was written in PL/I.
These were just a few of the issues of the time.