The salaries don't much matter. It's not that the KHL tempt players in EHM to play there. It's that because the AI is very basic, Riz has done something that's very common in Single Player games. He's removed certain restrictions/rules that the player has for the AI. Which is essentially cheating, but it's 100% needed to make low complexity script based AI work. For example the AI has an inifite budget (which comes into play in Europe sometimes as teams can overcap their salary budget by over 100% with loaned players and still have money left to buy players at May 1).
The same thing, as I touched on before, is true for AI owned RFAs. If you as a player have an NHL level talent go to RFA and don't offer them a good enough contract/any contract they file for salary arbitration and you either sign them on that wage or lose their rights. That way other NHL teams can swoop in. In real life you obviously also have Offer Sheets, since they are a non-essential part of gameplay (at least at a glance) the AI is not scripted to be able to do that. Because that would take a lot of time that Riz does not have.
As a result if an AI team does not sign their RFA (which is common) that player is still "stuck" with his rights to that team. He literally cannot play in the NHL at all, no matter what, unless THAT team signs him. This is where a bit of a catch-22 with how the AI rates talent comes in, the AI based on my experiences in game has to put a lot of stock in players "reputation" value. It's the only way I can think of to explain why the AI always favor bad old players over young skilled players on their teams. Those old players have simply accrued so much rep and those young talents haven't got enough rep+talent and as a result the AI will decide that the old 4th liner is better than that young talent. But because the AI won't play the young player, that player can't gain enough Reputation to get high enough reputation to be played over that old 4th liner with more reputation. As a result they end up sitting in free agency, a player with as comparably high rep and former league experience (since leagues too have reputation values) won't be willing to play in a lower rep league. But over time as a free agent that player will slowly have their rep or the rep they require in a team/league drop until it becomes low enough for teams from lower leagues to swoop in. You can see this a lot when you play in Europe and have your eyes on a player you just can't quite sign. Wait until mid fall and they will be signable by you, you can always see when it happens to a player since like 5+ teams from the same league will send him offers on the same day his demands lower. This means that if you lower the rep of the KHL, he will just go to the SHL, if you lower the SHL he will go to Liiga or NLA. If you lower all those he will go to some other place. Because of how little money the AHL teams themselves have compared to big European clubs they will never go there. After enough years in the KHL/Europe a player will gain enough reputation from play there that he's just high enough reputation+talent for the NHL club who owns his rights to go "hey, that player is pretty reputable!" and sign something like a 31 year old Elias Pettersson from the KHL. Only to have him be their star player in the NHL for the rest of his career. Despite being at the same CA as he was for the last 8 or so years. Because the only way to get enough rep to be played by the AI in the NHL if you're not a 160+ PA player is often to go play in Europe until you get that rep and break the Catch-22
In my personal version of the db I drop the rep of all of Europe by about 1-2k to make it so the "right" players play in the "right" leagues. Because the stock db has most euro teams instantly drop almost their entire rosters to stock up on NHL free agents instead. They simply have too much rep and too much money. But in my db where I've dropped the rep and money in all leagues this RFA issue still happens, but the startup exodus does not. So the rep and salary budgets won't fix it at all. If you put the leagues low enough in rep and salary what will eventually happen is that the player will hit the roughly 1-2 year mark of being unemployed at which the game force retires the player (it takes a lot longer/shorter for different players, no idea why). So that won't work. The issue is that the AI doesn't have advanced enough scripting to look into the future and plan ahead at all. It acts 100% in the current second, it neither looks back at past events or try and make a call on future events (because again, that would take a lot of coding time that Riz does not have). As a result it just starts by signing the "easy signings" in the form of their bottom 6 older guys who will ask for a fairly low wage compared to the rep they have amassed over their career. Since the AI won't really try and haggle on these they will end up putting them against the cap. When that happens the AIs first go to move seems to be losing their starter goalie (which is a horrible place to start) in some form of dumb trade for nothing, or by letting him go as a free agent. This also means that the AI generally won't have enough money to sign its stars (because those salary discussions take longer, and thus by the time they get "done" there isn't enough cap space to make the contract happen). This is probably a partial cause of the AI waivering top 6 players a lot. It paints itself into a corner with those "in the moment" contracts, ends up way over the salary cap. But since it considers that player "untradeable" the only option left to fix the cap situation on the AI's decision tree is to waiver them. At least that's what I assume is happening there.
Until the AI becomes able to look ahead and plan the cap accordingly this issue won't be fixed. It's not the huge superstar contracts that really cause it either, so lowering the max possible wages won't help. I've never seen the AI sign a contract above 13m~ in the NHL regardless. The issue is that the AI starts at the wrong end when it renews contracts, and that the AI doesn't look forward to value the future worth of the prospect when signing them. The AI also takes past performance into account when looking at what a player is worth. This is part of how I could print 1st round picks with the Jets. My players all overperformed hard, it drove the AI's perceived trade value of them up and let me get 1st round picks for 3rd line players. On the flipside of this we have the catch-22 again. The AI won't give the prospects top 6 ice time over their aging stars who lost their legs 8 years ago but still keep on trucking due to the whole "older players get better when they lose their legs" thing. As a result someone like Nolan Patrick will play 3rd/4th line minutes with no PP and put up like 0.3 PPG on his entry. The AI will go "I'm not signing you on a 4-6M a year bridge deal", because they haven't performed to that level due to no ice time. So there are a lot of problems working together here to cause this situation, and until most of them are fixed this will still be a thing. Bandaid fixes won't really work because the root of the issue is something that at a glance shouldn't have anything to do with AI RFA management in the form of how the attribute decline doesn't work properly any more. Coupled with the ordering of the decision tree when signing players seemingly being wrong, and probably a plethora of other issues in the backend that we can't even see clues of as players. This game has a lot of math errors, typos and other such things that we can see. The only logical conclusion is that there are about as many errors in the backend that makes the game run. Some of these issues are "design issues" as in the AI's decision tree not being very well planned. But there are probably a fair few garden variety "bugs" in the code playing it's part here. But it's quite obvious this would take a hellish amount of time for a single guy to fix. Especially when his company has him chained to another project all year every year. Because FM has plenty of broken stuff that needs fixing too.
Oh and on a final note to keep this Off Topic train rolling, even if you lower the rep and salary of every team it won't matter in the long run. EHM runs on an unsustainable model for both reputation and salary budgets, the game is in a constant state of inflation because every single team (more or less) gains budget every year. There is to my knowledge no way for a team to lose Reputation* so eventually given enough time every team in the game will get to the 10000 reputation cap. In the later years of my Jets save a lot of Aging NHLers were playing in the Norwegian GET Ligaen, because the inflation over time meant they had enough rep and salary budget to sign those guys. So no matter what we do to try and fix things in the db, the game will ruin them all over time. Because it's not a very well designed game, sadly.
*Because of a math error in the formula for Reputation gain you lose Reputation instead of gaining it when you gain Reputation while at the 10000 cap.
Finally, to get back on topic. I've started up the Pentagon challenge save. I'm starting off with the Edinburgh Capitals in the EIHL, because they have the lowest Rep and Wage Budget in that league. I then did a full purge of both the Staff and the Players. Complete clean slate. If you're familiar with the EIHL this pretty much happens from year to year with the players anyways in the bottom teams. In my classical European fashion I went for a team of only Youth players, because I love player development. Also it's completely and utterly overpowered since when you play in the UK all the generated youth players there become insane compared to when you don't play there. So my 15 year old British players are good enough to probably be depth players in the British national team. The rules in the EIHL allow for 14 import players (non-British), and I've stocked up on Swedish (and 1 Swiss + 1 Austian) talent. The average age of my roster is currently 16.23 years old. Pre-season was good to us, and this is the lineup I ended up with and the pre-season stats of our players:

Because I'm a bit of an idiot at times I forgot that you're allowed 14 import players, and instead aimed for 11 import players (you're allowed 11 non-EU players). So I will need to swap that lineup around a little bit. I've currently got my spare import players in farm leagues, juniors and out on loans. The eagle eyed will see that I've got Samuel Fagemo on the team. I always love when you have cross-over between your NHL team and EIHL team, it's entirely reasonable. This is a much worse, much younger Fagemo though. Our best game in pre-season was a 13-1 win against Fife Flyers, but pre-season and real season are two very different beasts with a team this young. I'm quite hopeful we're looking at a potential CHL challenger 4 or so years down the line once our talent has filled out a bit, or at least gone through puberty>.>
It's nice to get a whirl at Europe in a new db. In last year's db I have so much experience in Europe I essentially know of every single steal/hidden gem to get. It's fun to get a new slate with a tonne of players I've never had to deal with before. As well as some old faces being re-balanced for the new db. This is on a edited version of the 9.4db though, with all the budget and rep fixes I mentioned before. I can't be bothered to make them for 9.6