A solution without embedding goes as follows.
As has been pointed out in the answer by Lee Mosher, the problematic part in just changing the length of all distances by a small amount such that all become different are instances where the triangle inequality is an equality.
That means if you have 3 points $A,B,C$ with $d(A,B) = 1, d(B,C) = 2, d(A,C) = 3$ and you need to change the distance between $A$ and $C$ because the distance $3$ exists between points in $X$ somewhere else, and you choose to increase $d(A,C)$, then you must also change either $d(A,B)$ or $d(B,C)$, as otherwise the triangle inequality isn't true any more.
I'll call such a triangle of 3 points (all assumed to be different) where the triangle inequality is actually an equality a flat triangle and it has a long side and two short sides. If you need to change the length of one side of a flat triangle, you'd rather want to increase short sides and decrease long sides. But since each side can be in multiple flat triangles and sometimes be a short side in them and sometimes a long side, that isn't trivially possible.
So it would be nice to have a coordinated change of multiple side length such that afterwards the distances still form a metric space but there are no more flat triangles. If we can do that (with changes to each distance say less than $\frac\epsilon{2}$), we can then just change distances that are duplicates one after the other just 'a little bit', because we no longer need to worry about triangle inequalities being broken for even arbitrary small changes.
To get that coordinated change, we use the complete graph $K_X$ with vertices being the points of $X$ and edges $e_{\{A,B\}}$ between $A, B \in X$ and construct an integer edge evaluation $V$ for it, that means $V$ is a function that assigns each edge an integer value. That evaluation $V$ will later dictate which distances need to be changed and by how much.
We construct that evaluation iteratively and start with every edge having value $0$. Then we look through all the sides that are the long side of at least one flat triangle and order them increasing by length (e.g the distance between the end points). If we have duplicate lengths, the internal order between them doesn't matter.
We now start with the first such side $l$ (the shortest of the long sides) and want to change its valuation. We initially gather all flat triangles where it is a long side, say triangles $T_1, T_2,\ldots, T_k$. Each such triangle has 2 short sides $s_1$ and $s_2$ and we calculate $r_i = V(s_1) + V(s_2) + 1$ for each triangle $T_i, i=1,\ldots,k$. Finally we set $V(l)=\max(r_1,\ldots,r_k)$.
We now repeat this algorihm with the next side from our ordered list of long sides, do the same calculations and end up with an evaluation of that long side, a.s.o until we have exhausted the list.
This algorithm has a few properties:
- After initially setting every value to $0$, it then sets the value of a side at most once.
- In every flat triangle, the long side is set last.
From those properties it follows that in every flat triangle (short sides $s_1, s_2$ and long side $l$) we have
$$V(l) > V(s_1) + V(s_2) \label{val_inequ} \tag{1}$$.
For 3 different points $A, B, C \in X$, we define
$$w(A,B,C) =|d(A,B) + d(B,C) - d(A,C)|,$$
in other words how much you can change one of the distances in the triangle and still keep that instance of the triangle inequality satisfied. If $A,B,C$ form a flat triangle with $AC$ being the long side, $w(A,B,C)$ is zero, otherwise it is positive.
Let
$$w_X = \min(\{w(A,B,C) > 0\}),$$
where the minimum is taken over all ordered triples $(A,B,C)$, and ignoring zero values of $w$.
$w_X$ describes the wiggle room we have when dealing with any non-flat triangle; changing one side length by less than $w_X$ is guaranteed not to violate the triangle inequality in any non-flat triangle.
Let $S$ be the shortes distance between any two different points of $X$.
Let $M$ be the maximum evaluation $V$ of any edge. We can now define
$$\delta = \frac12 \min \left(\frac{w_X}{3M}, \frac\epsilon{M}, \frac{S}{M}\right).$$
We can now define new distances between points as follows:
For each set $\{A, B\}$ of different points of $X$, let
$$d_{nf}(A,B) = d(A,B) - V(e_{\{A,B\}})\delta.$$
As can be seen, the new disctances are smaller or equal to the old ones. Since a distance changes by at most $M\delta$, we can see that the choice of $\delta$ makes sure no distance becomes negative or zero and each distance change is at most than $\frac\epsilon{2}$.
What needs to be verified is that the new distances are also a metric. Positive definiteness has just been mentioned, the definition make it symmetric as well. So the triangle inequalities are left to be checked.
For all non-flat triangles, since each side changes by less than $\frac{w_X}3$, the triangle inequality is guaranteed to be true, and the triangle remains non-flat. The same is true for the 'non-critical' triangle inequalities in flat triangles.
For the triangle inequality of the long side $AC$ of a flat triangle $ABC$ we have, using \eqref{val_inequ}
$$d_{nf}(A,C) = d(A,C) - V(e_{\{A,C\}})\delta < d(A,C) - (V(e_{\{A,B\}}) + V(e_{\{B,C\}}))\delta = d(A,B) + d (B,C) - V(e_{\{A,B\}})\delta - V(e_{\{B,C\}})\delta = d_{nf}(A,B) + d_{nf}(B,C)$$
That means that not only is the triangular inequality true, it has changed the triangle into a non-flat one.
So we are now at the point we hoped to get: We have a new metric defined on $X$, with the values at most $\frac\epsilon{2}$ away from the original, where there are no longer flat triangles.
As explained above, we can now change each distance that is a duplicate of another 'a little bit' and need not worry about having to adjust other distances to correct for a no longer true triangular inequality.