JavaScript (ES6), 124 bytes
Processing 10 points on TIO takes about 35 seconds.
f=(a,X,Y,d=m=1/0,p=[])=>a.map(([x,y],i)=>f(a.filter(_=>i--),x,y,1/d&&d+Math.hypot(x-X,y-Y),[...p,[x,y]]))+a?o:d>m||(m=d,o=p)
Try it online!
Commented
A recursive function that tries all permutations of the input points, computing the length of the path for each of them and keeping track of the shortest one.
f = ( // f is a recursive function taking:
a, // a[] = input
X, Y, // (X, Y) = coordinates of the previous point
d = m = 1 / 0, // d = total distance, m = minimum distance
// (both initialized to +Infinity)
p = [] // p[] = current path
) => //
a.map(([x, y], i) => // for each point (x, y) at position i in a[]:
f( // do a recursive call:
a.filter(_ => i--), // with the i-th entry removed from a[]
x, y, // using (x, y) as the previous point
1 / d // set the distance d to 0 if this is the 1st point
&& // otherwise:
d + // update d by adding
Math.hypot( // the Euclidean distance between
x - X, y - Y // the points (X, Y) and (x, y)
), //
[...p, [x, y]] // append the point (x, y) to the path
) // end of recursive call
) // end of map()
+ a ? // if a[] is not empty:
o // just return o[]
: // else (complete path):
d > m // unless the new distance is greater than m,
|| (m = d, o = p) // update m to d and set the output o[] to p[]
(87, 3) (70, 20) (70, 22) (67, 39) (70, 44) (62, 89) (47, 59) (40, 40) (42, 31) (7, 15)
has length 196.3336221458198 while the reverse(7, 15) (42, 31) (40, 40) (47, 59) (62, 89) (70, 44) (67, 39) (70, 22) (70, 20) (87, 3)
has length 196.33362214581976. \$\endgroup\$