In that sentence, the words would have are used to talk about a fact-based possibility that could have happened (in the past), but didn’t either by choice or not.
They would have reached the hotel earlier, but they didn’t since their flight was delayed (e.g. no choice).
They would have reached the hotel earlier, but they decided to sightsee and visit the zoo first (e.g. by choice)
Conversely, should have is used to talk about giving advice on a past, hypothetical event (e.g. something that did not occur, yet, would have been a good idea to do then, at that time, but which, in fact, didn’t happen and which, typically, lead to a bad result).
The champ should have observed curfew and gotten a good night’s sleep (which did not happen, it is past, it is hypothetical) before the title match, but partied until late, and as a result, lost.
The man should have stopped smoking years ago (which did not happen, it is past, it is hypothetical), but he didn’t and now has lung cancer.
In your example, the ‘90s did, in fact, happen, and people could have learned from it, but they didn’t
So, while both phrases refer to the past, albeit in different ways, which one, according to its definition, fits better under the circumstances?
That is why ‘would’ was used.
As to your follow-up question regarding the word “might,” while both it and should go to the degree of possibility, should has the much higher degree of certainty. For example:
It should start raining anytime now (almost no doubt, to be said while noticing the dark clouds overhead, so like a 75-80% chance). It might start raining anytime now (maybe it will, but maybe it won’t, to be said while noticing the sporadic groups of dark clouds, so like a 40-50% chance).
As to it “reading” a certain way, realize that native speakers often interchangeably use “would’ve, could’ve, and should’ve” in speech without any real thought behind as to the distinctions above, so perhaps that is what you are used to hearing.