Hello @jstryk ,
I can imagine a solution using 'Get files' on the library with 'Filter Query' to check if there're already files with that name. The 'Filter Query' below will check if there're files that already contain the filename and return all of them.
substringof('[FileName without extension]', FileLeafRef)
Note:
[..] is a placeholder, it must be filename WITHOUT extension
e.g. if your file is xxx, it'll return xxx.jpg, xxx_1.jpg, xxx_2.jpg.... all files that have the filename in title will be stored in the 'value' dynamic content. Then you use expression length('value') to calculate how many items were found, and you add that number at the end of the new file (1st file doesn't have any number, 2nd has _1, 3rd _2...).
There're limitations though. If the file names are similar, e.g. files xxx.jpg and xxxyyy.jpg, it'll return both when searching for xxx in file name (and you'll get files xxx.jpg, xxxyyyy.jpg, xxx_2.jpg). And also if there're multiple files with the same name uploaded at the same time they could both use the same number.
In the end I think using a timestamp is much easier and probably more reliable option.