Note that the approach does not actually break when the value is reached (and in the original case illustrated it will never result in a returned value since 107 is not even). The Do loop will go until the end whether or not the value in the first argument of the If statement is satisfied. An approach like this (without a Print statement since you want a returned value rather than a byproduct of the Do loop as a printed statement) will satisfy what you are looking for (using 14291 as a test case and returning both the value of i where it achieves its IntegerQ requirement and the result of that requirement):
Catch@Do[If[IntegerQ[14291/i], Throw[{i, 14291/i}]], {i, 2, 14291}]
And if you actually wanted to go through the whole Do loop and get all instances where the If statement evaluated to True you could use Reap and Sow like this:
Reap@Do[If[IntegerQ[14291/i], Sow[{i, 14291/i}]], {i, 2, 14291}]
Note that the first element of the list that is returned is Null because the Do loop does not return results--it just evaluates its argument.