I know the last-gen position battles were a popular feature. I didn't like them much as a developer because I felt like I was forcing the player think of preseason as a burden, forcing him to play meaningless games just to make sure the guy he wanted to start got enough stats to win his position battle.
I spent a lot of time struggling with this issue as I'd hoped to address it for Madden 25.
Let me spitball a moment...
I'm going to ignore memory concerns here because I don't know what the CFM RAM situation is anymore (it was bad for '13, we had to cut a lot due to RAM budget. This is why you can't view the All Teams CFM roster and free agency has a "Top 100" tab instead of all players).
First off, if I'm going to have position battles, I'm going to make it user-definable. So I'm going to allow players to categorize players as; Camp body, bubble player (automatically in a Position Battle with other Bubble Players at his position or related position), or lock.
Next, CPU generated position battles like in '05. However, I'm going to allow the user to declare a winner at any point. If it says I've got a position battle between Josh Allen and A.J. McCarron and I already know I'm going with McCarron, I can just state it outright and end the battle, no penalty.
For the battles I want to let play out, I'm going to include substitution logic to ensure the two get roughly equal playing time in pre-season games. For example, if we're talking about the 2nd preseason game, I'll have the 2nd man in the battle come in in the 2nd quarter so he takes half the 1st team snaps.
Next, I'm going to rework the logic to be less about traditional stats and more about what I might call scouting stats. This is good plays/bad plays. Rather than saying, one guy had 5 catches for 37 yards and a touchdown s. 2 catches for 73 yards and 2 touchdowns, I'm going to track how often the guy won his "opposed checks" on the field (i.e. even if he didn't get the ball, he beat his corner on the route running vs. man cover check), I'm going to use that deeper data because it's useful data for the user.
Finally, the position battle will come down to the user's preference. Madden 05 gave the team a morale penalty if you named the loser of the position battle starter. I'll do that, but only when the difference is clear and obvious. If it's close, I'm going to let the user pick without penalty (or maybe just a penalty to the winner's confidence).
Also, "Learning" attribute and playbook knowledge. Preseason can be used to work on plays and get players familiar.