Breaking down my experience with specific notes about the game balance and experience, the difficulty curve was quite good. The first few Gym Leaders still put up a fight, but don't require as much work compared to later battles and I don't think I wiped or reset (I tend to reset if I feel a battle is unwinnable, though especially if I'm tilted this can be as much as letting a Pokemon use one setup move or a move misclick) many times to them. Erika was more challenging - Triage Meganium with Giga Drain in Grassy Terrain soloed my team multiple times - but I broke past her eventually. Same with Blue, Brendan, and Johto battles up to this point. Silph Co was where things started getting a bit more spicy.
Blue still wasn't too much of a problem, but the tag battle with Brendan against the executives was my least favorite battle in the game and the only one I would go so far as to suggest nerfing or changing. It felt like I was fighting against my partner and the opponent at the same time with him smashing my Pokemon with Boomburst (sometimes one-shotting them with crits) or causing my boosted moves to hit resistances with weird targeting, while Ariana and Archer work in perfect sync and have an insanely optimized doubles composition. I was admittedly slightly stubborn with my team and had few spread-target moves, and could have bought things such as Feline Power Hyper Voice Persian (probably the strongest doubles nuker I could think of you can use at this point) or something with Wide Guard to try and babysit Brendan, it was far, far more difficult than Giovanni afterwards, I felt like I may not have even able to win without something like a Heat Wave/Play Rough miss or the AI cooperating perfectly with me. Sabrina also fell like a sack of potatoes in comparison, though I can't really remember why. Koga kicked it back up to 11 with his untyped team, though I did find the ninja theme clever; albeit I was a little underleveled and still could have optimized my EVs more at this point; I had not fully trained until the Cerulean Cave events but was slowly cleaning out useless EVs as the game progressed with those amazing EV remover NPCs. I wouldn't nerf his team at all, though.
If anything, Blaine afterwards should focus on the sun rather than pure Fire types, as he was much easier in comparison. (still requiring a couple resets, but battles such as A&A and Koga were in the 20+ attempts area versus 2 or 3 for him. His Typhlosion is pretty spooky, though. Specs Priority Eruption in the sun, thank god for Extreme Speed). Brendan in Fuchsia wasn't tough, and May took one attempt despite me being caught off guard and 2 or so levels below her. Jasmine and Pryce pick up the difficulty on the Johto side as well, though they were also in the 2-5 attempt range. The Cerulean Cave events were cool, and the battles in there were intense but fair. Ariana and Archer back to back was an extremely difficult fight, but I felt like I had far more agency due to me controlling 6 of my pokemon rather than 3 in Silph Co. Even with the 6 v 8 nature of it I'd rather re-do that fight than the previous one with them. Giovanni was also a beast , and bought massive threats to the table, but one I could slowly work my way around each attempt and learn his team. Both probably were in the 15-25 attempt range. I will admit here I did abuse Sucker Punch use by the AI a few times during the game to set up or at least PP stall it to avoid priority, but the AI was mentioned in the buglist, and faking out Sucker Punch is possible against real people. Most of the time the AI was very intelligent and would switch immediately to gain advantages rather than randomly like Pokemon's normal "smart" trainer AI type. It was consistent enough one could learn to predict it as part of their strategy, which I consider positive to allow the player to do rather than abusing the AI. (Getting 5 free calm minds off every Pokemon with Sucker Punch is a little cheesier, admittedly.) Learning to read the opponent is part of PvP, after all. Some teams could use pokemon with Haze or Unaware if they fit in the composition, I don't think I ever encountered either or at least was not stopped by them.
Continuing with my opinions on important battles, Clair only took one attempt for me. Not really sure why, again, I didn't find her team flawed in design. I felt my team composition simply succeeded much more against certain pokemon than others due to being heavily offensively focused. The penultimate Blue battle wasn't too bad, though I needed to keep priority up to not auto-lose to Shell Smash Mega Blastoise; still only took 2 attempts. Brendan was more in the 5-10 range, mostly due to usually not having enough Pokemon left to deal with Latios once it came out. I liked how the cooltrainers in Victory Road had moderately competitiive teams, though having to re-push the boulders every time I left to heal was a hassle. Nudging the nurse inside Victory Road instead of outside might have helped there. The Pokemon League was similar to Cerulean Cave, tough, but not in an annoying way like the tag battle. I struggled much more with Agatha and Lance compared to Lorelei, Bruno, and even Blue, but I felt it was a team-matchup issue again. My team was heavily reliant on the revenge killing of Furret (useless against Agatha) and often the Sticky Web of Galvantula (doesn't help against Lance's super-fast flying/levitating Pokemon). I don't think I could have done it without saving between battles, but that's on me, not on the game. (And as a contrast, Blue had multiple pokemon Furret's Extremespeed could OHKO or near-OHKO with a Choice Band. Furret often going 1 for 2-3 made it a vital team member.) Probably took about 4 attempts for Lorelei, 1 for Bruno (Ah, Bruno, always the weak one), and 10-15 for Agatha and Lance, though I felt Lance was harder. Overall I considered the most difficult battle in the game for me either major battle in Cerulean Cave, but only the tag battle truly made me rage within.
Past the wall of text, overall I found the difficulty fairly well balanced, but I don't know if the inconsistency in required attempts for late-game battles was due to my team's flaws or the enemy team's flaws. I'd say it's more towards the former than latter. While I know the game is being redone for 2.0, I hope this feedback is helpful; and doesn't come off as being a complainer regarding the Archer and Ariana tag battle. I don't think it should be removed, though, but possibly tweaked so Brendan at the bare minimum doesn't blow you up with his Exploud, I would take the lower power on it using Hyper Voice to avoid being hit by my ally. If you seek to make the game more difficult, I strongly suggest doing so without doing it by making Pokemon, tutors, or TMs obtainable later in the game than they currently are. I feel the huge variety of choice is this hack's strong suit. Setup moves can still wreck the AI, but there are at least priority, focus sashes, scarves, Taunt, to counter it. As I said, there could possibly be a bit more Haze, Clear Smog, or Unaware usage, though. Similarly, I felt the opponent almost never removed my entry hazards, though they were very, very consistent about setting them. I think my Sticky Webs were rapid spun away once. A few more Rapid Spins and Defogs (maybe even throwing Court Change in a moveset if possible) would help on that end, though flying types at least get around it.
As for the Pokemon themselves, I love any hack that buffs weaker Pokemon, and while most of my hall of fame Pokemon are already high tier (Charizard was often the weakest link lategame), Furret was a blast to use. Balanced due to being an Extremespeed bot similar to Linoone but with less risk and reward, but once I got the Choice Band, watching things die from 100% from a Furret's priority move was incredibly satisfying, and made it a vital revenge killer and cleaner. My team centered around Sticky Web and offense for the most part (though Gliscor didn't fit as well into that, it's one of my favorite Pokemon and still very powerful. Once that was up, I could be comfortable that my offensive threats would always hit first barring very fast scarfed Pokemon or priority moves. I should probably have gotten some form of hazard removal or prevention (stuff like magic bounce) myself as it caused Charizard to be nearly unusable in many battles, but it was incredibly strong when it did get its times to shine. Galvantula mostly existed to place sticky webs, sometimes even using a choice scarf to guarantee it; as sometimes other Pokemon ran Explosion leads, I would always consider it a victory when that trade occured.
Lastly, that battle before the League was hilarious. I was expecting a puzzle battle at first, but what I saw was much funnier.