Exact solution: Replace each "d4+1" with "d6, reroll 1 and 6"
Each type of healing potion (except the supreme; see below) is some multiple of "d4+1", so a formula that emulates this with a single d6 would be ideal. d4+1 produces a uniform distribution from 2 to 5 inclusive, so a simple rule to emulate this is to roll a d6 and keep re-rolling it until you don't roll a 1 or 6. So, for example, a potion of greater healing, normally 4d4+4, would become 4d6, rerolling all 1s and 6s. Since this rule exactly reproduces the distribution of a d4+1 roll, potions rolled using this rule will behave identically to normal potions rolled using d4s.
As a side bonus, the new formula doesn't involve a modifier, so you don't need to worry about labeling different size potions with different modifiers. This means that you don't necessarily need a different label for each potion size. Just fill it with the appropriate number of dice and make sure people know the rerolling rules.
Note that unlike the other potions, the supreme potion of healing breaks the pattern of having the number of dice equal the modifier. Instead of 10d4+10, it heals for 10d4+20. To apply this rule to the supreme potion, split this into (10d4+10)+10, then replace (10d4+10) with 10d6. This yields 10d6+10 as the new formula for a potion of superior healing.
Quicker but less precise solution: replace each "d4+1" with "d6"
If rerolling some dice, potentially multiple times, is too slow, you could just roll the d6s once and be done with it. It just so happens that "d4+1" and "d6" have the same average roll (3.5), so this will heal for the same amount on average. However, this approach clearly increases the variance, which means that these potions will be more "swingy".
There are a couple of ways to partially mitigate this "swinginess" without using the per-die reroll method described above. First, you could simply say that the potion never heals for less then the normal minimum, regardless of the roll. For example, a greater healing potion would heal a minimum of 8 hit points, even if you roll 4 1s. The minimum amount is easy to calculate: it's twice the number of dice (except for supreme potions, as mentioned above). Alternatively, if the roll is less than the normal minimum, reroll all the potion's dice at once. This is still quicker than selectively rerolling specific dice, since you can scoop them all up at once. Using either of these methods, the rolls will still be a bit more swingy than the standard formula using d4s, but at least you'll never heal for less than what would normally be possible.
You probably don't want to impose the corresponding limit on the high end, since the math is a bit harder, and I doubt your players are going to complain about the rare cases where potions heal too much.
Similar mean & variance: Replace each "d4+1" with "2d6/2"
There is a pretty good way to get a similar mean and variance to the normal potion formula using only d6s, with no rerolls: for each d4+1 in the potion, roll two d6s and take the average. In other words, Nd4+N becomes (2*N)d6/2. This has exactly the same mean and only a slightly higher variance, so the distributions are quite similar. The downside of this solution is obvious, of course: you have to roll and add up twice as many dice.
Note: Since you're dividing by two, you'll need to choose a rounding rule. I recommend rounding up, since otherwise the mean will actually be 0.25 lower than a normal potion, and while we all know that this tiny amount is insignificant in the grand scheme, that probably won't stop your players from complaining about how you "nerfed" their potions. As you might expect, rounding up has the opposite effect, giving a mean that is 0.25 higher.
As with the previous rule, you can still apply the variant that any roll lower than the normal minimum potion roll is treated as that minimum (e.g. 8 for greater healing potions).
Here are AnyDice formulas for all of the above solutions:
\ Set N to 2 for regular healing potion, 4 for greater, 8 for superior \
output Nd4+N named "Nd4+N (Normal potion formula)"
output Nd6 named "Nd6, no rerolls"
output [highest of 2*N and Nd6] named "Nd6, minimum 2N"
output ((2*N)d6+1)/2 named "2d6 halved, rounded up"
output [highest of 2*N and ((2*N)d6+1)/2] named "2d6 halved, rounded up, minimum 2N"