Muitas, muitas vantagens mesmo. Mas acredito que aos poucos você vai sacar a pegada da POO.
Olhe para as variáveis que você criou. Elas estão soltas, não têm relação uma com as outras a não ser pelo nome "Alex" que você colocou nelas. Imagine que você tenha que enviar a conta do Alex para uma função que fará uma análise (ver o saldo, histórico, salário do titular, etc) para ver se ele pode receber um aumento de limite ou não. Como fazer isso dessa maneira procedural? Meio complicado, não?
Para entender POO, você tem que entender o que são classes e objetos. Classes são como "moldes" de coisas da vida real, e através desses moldes você pode criar os objetos.
Exemplo: criei a classe Carro que contém as características (atributos) "cor", "motor", e "ano". Os comportamentos (métodos) dele que criei foram "acelerar" e "freiar".
Através dessa Classe, posso criar diversos carros no meu código. Por exemplo:
val monza1 = Carro("preto", "v8", 1995) //esse é um objeto da classe Carro
val fusca1 = Carro("Azul", "1.0", 2003) //esse é outro objeto da classe Carro
Claro, o exemplo acima é bem simples. Mas imagine como isso pode ser escalado... Eu posso criar um sistema para uma garagem, e na classe Carro pode existir vários outros atributos, inclusive posso criar outras classes para utilizar como atributos, como Cliente. E esse cliente pode ter atributos na sua classe, como "nome", "cpf", "endereço"...
Consegue perceber como fazer isso de maneira procedural é impraticável?