There was a 3rd choice, i.e. allocatable arrays not attached to a derived type. Of course codes sometimes were more complex/less structured because of this constraint, but performances were not hurt by the pointers.
Another solution was to have pointer components anyway, but pass them down to non pointer dummy arguments in the computing routines. Sometimes it was requiring an additional layer of calls, but at least performances were not hurted by the pointers.
Sure, it is now easier with the allocatable components, but it was possible nonetheless to have the same performances back then.