Второй вариант.
Первый очень плох из-за того, что api прибивается гвоздями к какому-то modal, хотя должно заниматься только общением с сервером, в общем, полнейший бардак и никакого разделения на слои. Третий не удобен, потому что в таком виде в случае ошибки response будет равен значению, возвращаемому функцией modal, это надо проверять отдельно и всё равно выходить. Во втором всё как положено - либо работаем с респонсом, либо вываливаемся в catch