I have separated 1 and 2, but I have always put the actions you define as 'lead lifecycle' into the flows within each program.
For instance, currently we have campaigns in programs set up such that: If fills out form 'trial' then add to list, change data values, sync to salesforce etc. Rather than having a 'lifecycle program' which is listening for these changes and completing the sync.
Is this poor practice? Why?
This is not a poor practice as long as you do not specifically assign leads in your programs, you just push them to SFDC so they exist there.
The difficult point on the long term is maintenance in case you business rules change. And business rules may change frequently mainly on 3 aspects :
So in order to make it easy to maintain on the long time, it is strongly recommended that you keep these 3 things centralized in a reduced number of programs. it's also recommended that these lead management programs are not maintained by too many people in your organization, at it requires marketo + SFDC + organizational skill that no anyone will have.
But just pushing new leads lead in SFDC in a event program so that you make sure that all data is kept fresh would not hurt. The only drawback is that you will probably push that lead to salesforce twice within a few minutes, as your centralized lead management smart campaigns will do the same.