A diferença é que no primeiro código você descreveu como deve ser ordenada a lista de números, e chamou essa receita de bubble_sort. Depois aplicou essa receita de ordenação à lista, com bubble_sort(scores_bubbles).
No segundo código, em vez de você descrever como a lista deve ser ordenada, usou uma receita pronta, do próprio Python, chamada sorted.
Existem várias receitas de como ordenar as coisas, inclusive várias formas diferentes de ordenar números, algumas mais rápidas (mais eficientes) e outras mais demoradas (menos eficientes).
No seu primeiro código, você usou a estratégia bubble sort, que é uma das mais simples e menos eficientes. No segundo código, você provavelmente não sabe, mas está usando uma estratégia diferente, chamada Timsort. A vantagem é que você economiza tempo usando a receita que já vem com o Python. A desvantagem é que nem sempre ela é a melhor opção, e é importante que você mesmo saiba escrever as principais maneiras de ordenar, como fez como o bubble sort. Ou seja, no primeiro código você realmente praticou a lógica de programação em algoritmos de ordenação, no segundo, não, apenas usou o algoritmo pronto do Python.