Про БЭМ уже сказали, а про спан и див коротко: должны быть общее определение всяких дивов и спанов, т.е если я буду читать ваш код и увижу span, я пойму что это строчный элемент, мне будет странно, если он окажется блочным.
Обычно (лично я) беру текст в спан, чтобы придать ему отличительные черты, от другого такого же текста. Например, перекрасить в другой цвет или увеличить размер.
Про ваш тег p, лично я любой текст, который вложен
в статью или блок с текстом, всегда обозначаю через этот тег. Выделил это для того, чтоб не было желания писать следующее:
Текст
По третьему пункту: это нормальная вложенность, если я собираюсь использовать конкретный стиль для ссылок, например в меню, я делаю эти стили вложенные в стили меню. Если же нет - выношу стили, чтобы их можно было применять везде.
Если вам нужно чтобы каждая ссылка в меню была по-разному оформлена, то все равно все так же и будет записываться, с небольшой корректировкой:
#block{
}
#block a{
}
#block a:first-of-type {
}
#block a:nth-of-type(2) {
}